package ve.usb.ddp;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.GifImage;
import java.io.File;
import java.lang.Integer;
import java.math.BigInteger;
import java.net.URL;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.ddp.hibernate.*;

import java.util.List;
import java.util.Date;
import java.util.LinkedList;


import org.jCharts.axisChart.AxisChart;
import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelPosition;
import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelRenderer;
import org.jCharts.chartData.AxisChartDataSet;
import org.jCharts.chartData.DataSeries;
import org.jCharts.chartData.interfaces.IAxisDataSeries;
import org.jCharts.properties.*;
import org.jCharts.types.ChartType;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import org.jCharts.encoders.PNGEncoder;
import com.itextpdf.text.Image;
import org.jCharts.chartData.PieChartDataSet;
import org.jCharts.encoders.JPEGEncoder;
import org.jCharts.nonAxisChart.PieChart2D;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.jCharts.encoders.ServletEncoderHelper;

/**
 * 
 */
public class AccionesCU008EstadisticasPAS extends CohesionAction {
    
/**
     * Called by Struts for the execution of action A_Pre_PrincipalEstadisticasPAS.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_PrincipalEstadisticasPAS(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_PrincipalEstadisticasPAS", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pas, encargado_paa, encargado_pai, encargado_prd, director_DDP
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Comienza nuestro codigo*/
            request.getSession().setAttribute("L_Anos", listYears());
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_DivisasTramitadasPorDDP.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_DivisasTramitadasPorDDP(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_DivisasTramitadasPorDDP", "A_Pre_PrincipalEstadisticasPAS", "V_PrincipalEstadisticasPAS", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;
        final int SALIDA_2 = 2;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP, encargado_prd, encargado_paa, encargado_pas
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_EstdPAS_DTDDP fF_EstdPAS_DTDDP = (F_EstdPAS_DTDDP)form;
            /*Empieza nuestro codigo*/
            int ci = fF_EstdPAS_DTDDP.getCi();
            String trimestre = fF_EstdPAS_DTDDP.getTrimestre();
            String semestre = fF_EstdPAS_DTDDP.getSemestre();
            String per1;
            String per2;

            if (trimestre.equals("0")) {
                if (semestre.equals("Enero - Junio")) {
                    per1 = "01-01";
                    per2 = "06-30";
                } else if (semestre.equals("Julio - Diciembre")) {
                    per1 = "07-01";
                    per2 = "12-31";
                }
            }

            if (trimestre.equals("Enero - Marzo")) {
                per1 = "01-01";
                per2 = "03-31";
            } else if (trimestre.equals("Abril - Junio")) {
                per1 = "04-01";
                per2 = "06-30";
            } else if (trimestre.equals("Julio - Septiembre")) {
                per1 = "07-01";
                per2 = "09-30";
            } else if (trimestre.equals("Octubre - Diciembre")) {
                per1 = "10-01";
                per2 = "12-31";
            } else {
                per1 = "01-01";
                per2 = "12-31";
            }

            int anual = fF_EstdPAS_DTDDP.getAnual();
            String fechaIni = String.valueOf(anual) + "-" + per1;
            String fechaFin = String.valueOf(anual) + "-" + per2;

            List<Object[]> listProfObje;
            String query;
            if (ci != 0) {
                query = "SELECT prof.idprofesor, pas.idpas "
                        + "FROM \"public\".profesor as prof, \"public\".pas as pas, \"public\".monto as monto "
                        + "WHERE prof.idprofesor = pas.profesor "
                        + "AND prof.ci =:ci "
                        + "AND monto.pas = pas.idpas "
                        + "AND '" + fechaIni + "' < monto.fecha_tramite "
                        + "AND monto.fecha_tramite < '" + fechaFin + "'";
                listProfObje = (List<Object[]>) s.createSQLQuery(query).setInteger("ci", ci).list();
            } else {
                query = "SELECT prof.idprofesor, pas.idpas "
                        + "FROM \"public\".profesor as prof, \"public\".pas as pas, \"public\".monto as monto "
                        + "WHERE prof.idprofesor = pas.profesor "
                        + "AND monto.pas = pas.idpas "
                        + "AND '" + fechaIni + "' < monto.fecha_tramite "
                        + "AND monto.fecha_tramite < '" + fechaFin + "'";
                listProfObje = (List<Object[]>) s.createSQLQuery(query).list();

            }
            if(!listProfObje.isEmpty()){
                List<Profesor> listProf = new ArrayList<Profesor>();
                List<Pas>listPas = new ArrayList<Pas>();
                for(Object[] objectArray : listProfObje){
                    listProf.add((Profesor)s.load(Profesor.class, Long.parseLong(objectArray[0].toString())));
                    listPas.add((Pas)s.load(Pas.class, Long.parseLong(objectArray[1].toString())));
                }
                List<Integer[]> montosTrimestralesProf = new ArrayList<Integer[]>();
                List<Integer> listMontoProf = new ArrayList<Integer>();
                int montoTramProf = 0;
                int j = 0;
                for(Profesor prof : listProf){
                    prof.getCategoria();
                    int montoTramPas = 0;

                    for(Monto monto : listPas.get(j).getMontos()){
                        montoTramPas += monto.getMonto();
                    }
                    String[][] opciones = new String[4][2];
                    opciones[0][0] = String.valueOf(anual) + "-" + "01-01";
                    opciones[0][1] = String.valueOf(anual) + "-" + "03-31";
                    opciones[1][0] = String.valueOf(anual) + "-" + "04-01";
                    opciones[1][1] = String.valueOf(anual) + "-" + "06-30";
                    opciones[2][0] = String.valueOf(anual) + "-" + "07-01";
                    opciones[2][1] = String.valueOf(anual) + "-" + "09-30";
                    opciones[3][0] = String.valueOf(anual) + "-" + "10-01";
                    opciones[3][1] = String.valueOf(anual) + "-" + "12-31";
                    Integer[] montosTrimestrales = new Integer[4];
                    for(int i = 0; i<4; i++){
                        String query2 = "SELECT monto.monto " +
                                "FROM \"public\".monto AS monto, \"public\".pas AS pas " +
                                "WHERE pas.idpas =:id " +
                                "AND pas.idpas = monto.pas " +
                                "AND '" + opciones[i][0] + "' < monto.fecha_tramite " +
                                "AND monto.fecha_tramite < '" + opciones[i][1] + "' " +
                                "ORDER BY monto.fecha_tramite ASC";
                        List<Integer> montos = (List<Integer>)s.createSQLQuery(query2)
                                .setLong("id", listPas.get(j).getId()).list();
                        if(montos.size() == 1){
                            montosTrimestrales[i] = montos.get(0);
                        }else if(montos.size() == 0){
                            montosTrimestrales[i] = 0;
                        }
                    }
                    montosTrimestralesProf.add(montosTrimestrales);
                    montoTramProf += montoTramPas;
                    listMontoProf.add(montoTramPas);
                    j++;
                }
                Integer[] montoTrim = new Integer[4];
                montoTrim[0] = 0;
                montoTrim[1] = 0;
                montoTrim[2] = 0;
                montoTrim[3] = 0;
                for(Integer[] montosTrim : montosTrimestralesProf){
                    montoTrim[0] += montosTrim[0];
                    montoTrim[1] += montosTrim[1];
                    montoTrim[2] += montosTrim[2];
                    montoTrim[3] += montosTrim[3];
                }
                Double[] porcentajeTrim = new Double[4];
                porcentajeTrim[0] = Math.round(((montoTrim[0] / Long.valueOf(String.valueOf(montoTramProf)).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
                porcentajeTrim[1] = Math.round(((montoTrim[1] / Long.valueOf(String.valueOf(montoTramProf)).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
                porcentajeTrim[2] = Math.round(((montoTrim[2] / Long.valueOf(String.valueOf(montoTramProf)).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
                porcentajeTrim[3] = Math.round(((montoTrim[3] / Long.valueOf(String.valueOf(montoTramProf)).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
                List<Pas> pass = (List<Pas>)s.createQuery("from Pas").list();
                int montoTramTotal = 0;
                for(Pas pas : pass){
                    pas.getUniversidad();
                    for(Monto monto : pas.getMontos()){
                        if(monto.getFecha_tramite() != null){
                            montoTramTotal += monto.getMonto();
                        }
                    }
                }
                Long total = Long.valueOf(String.valueOf(montoTramTotal));
                Double porcentaje = (montoTramProf / total.doubleValue())*100;
                porcentaje = Math.round(porcentaje*Math.pow(10,2))/Math.pow(10,2);
                String porcetProf = "Se han tramitado "+String.valueOf(montoTramProf);
                porcetProf += "$ de un total de "+String.valueOf(montoTramTotal);
                porcetProf += "$ lo que representa un "+String.valueOf(porcentaje);
                porcetProf += "% de la cantidad total de divisas tramitadas por la DDP en la historia";
                double [] porcTotalesHist = new double[2];
                porcTotalesHist[0] = porcentaje;
                porcTotalesHist[1] = 100.00 - porcentaje;
                request.getSession().setAttribute("year", anual);
                request.getSession().setAttribute("montosTrimestralesProf", montosTrimestralesProf);
                request.getSession().setAttribute("porcetProf", porcetProf);
                request.getSession().setAttribute("listMontoProf", listMontoProf);
                request.getSession().setAttribute("listPas", listPas);
                request.getSession().setAttribute("L_ProfesorDivisas", listProf);
                request.getSession().setAttribute("montosTrimestralesTotal", montoTrim);
                request.getSession().setAttribute("porcentajeTrimTotal", porcentajeTrim);
                request.getSession().setAttribute("porcTotalHist",porcTotalesHist);
                request.getSession().setAttribute("opcion", 1);
                request.getSession().setAttribute("baosPDF", generarPDFDivsTrmtDDP(request));
            }else{
                salida = SALIDA_1;
            }
            fF_EstdPAS_DTDDP.reset(mapping, request);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_DivisasTramitadasPorDDP.msg1"));
        }
        if (salida==2) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_DivisasTramitadasPorDDP.msg2"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ProfCulminaronAS.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ProfCulminaronAS(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ProfCulminaronAS", "A_Pre_PrincipalEstadisticasPAS", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_pas, encargado_prd, director_DDP, encargado_pai, encargado_paa
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_EstdPAS_TrimSemAn fF_EstdPAS_TrimSemAn = (F_EstdPAS_TrimSemAn)form;
            /*Empieza nuestro codigo*/
            int anual = fF_EstdPAS_TrimSemAn.getAnual();
            List<BigInteger> listProfObje;
            String query;
            
            String fechaIni = String.valueOf(anual) + "-" + "01-01";
            String fechaFin = String.valueOf(anual) + "-" + "12-31";

            query = "SELECT prof.idprofesor "
                    + "FROM \"public\".profesor as prof, \"public\".pas as pas "
                    + "WHERE prof.idprofesor = pas.profesor "
                    + "AND '" + fechaIni + "' < pas.fecha_finalizacion "
                    + "AND pas.fecha_finalizacion < '" + fechaFin + "'";

            listProfObje = (List<BigInteger>) s.createSQLQuery(query).list();
            if(!listProfObje.isEmpty()){
                List<Profesor> listProf = new ArrayList<Profesor>();
                String[][] opciones = new String[4][2];
                opciones[0][0] = String.valueOf(anual) + "-" + "01-01";
                opciones[0][1] = String.valueOf(anual) + "-" + "03-31";
                opciones[1][0] = String.valueOf(anual) + "-" + "04-01";
                opciones[1][1] = String.valueOf(anual) + "-" + "06-30";
                opciones[2][0] = String.valueOf(anual) + "-" + "07-01";
                opciones[2][1] = String.valueOf(anual) + "-" + "09-30";
                opciones[3][0] = String.valueOf(anual) + "-" + "10-01";
                opciones[3][1] = String.valueOf(anual) + "-" + "12-31";
                Integer[] numProfsTrimestrales = new Integer[4];
                Double [] porcProfCulTrmAS = new Double[4];
                for(BigInteger idProf : listProfObje){
                    listProf.add((Profesor)s.load(Profesor.class, idProf.longValue()));
                }
                List<BigInteger> listProfTotal = new ArrayList<BigInteger>();
                String query2 = "SELECT prof.idprofesor "
                        + "FROM \"public\".profesor as prof, \"public\".pas as pas "
                        + "WHERE prof.idprofesor = pas.profesor";
                listProfTotal = (List<BigInteger>)s.createSQLQuery(query2).list();
                for(int i = 0; i<4; i++){
                    String query3 = "SELECT prof.idprofesor " +
                            "FROM \"public\".profesor AS prof, \"public\".pas AS pas " +
                            "WHERE prof.idprofesor = pas.profesor " +
                            "AND '" + opciones[i][0] + "' < pas.fecha_finalizacion " +
                            "AND pas.fecha_finalizacion < '" + opciones[i][1] + "'";
                    numProfsTrimestrales[i] = (Integer)s.createSQLQuery(query3).list().size();
                    porcProfCulTrmAS[i] = Math.round(((numProfsTrimestrales[i] / Long.valueOf(String.valueOf(listProf.size())).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
                }
                String query4 = "SELECT DISTINCT prof.idprofesor "
                    + "FROM \"public\".profesor as prof, \"public\".pas as pas "
                    + "WHERE prof.idprofesor = pas.profesor "
                    + "AND '" + fechaIni + "' < pas.fecha_finalizacion "
                    + "AND pas.fecha_finalizacion < '" + fechaFin + "'";
                List<BigInteger> listProfObje1 = (List<BigInteger>) s.createSQLQuery(query4).list();
                List<Profesor> L_ProfesorCulmino = new ArrayList<Profesor>();
                for(BigInteger idProfs : listProfObje1){
                    L_ProfesorCulmino.add((Profesor)s.load(Profesor.class, idProfs.longValue()));
                }
                for(Profesor prof : L_ProfesorCulmino){
                    prof.getCategoria();
                }

                Long total = Long.valueOf(String.valueOf(listProfTotal.size()));
                Double porcentaje = (listProf.size() / total.doubleValue())*100;
                porcentaje = Math.round(porcentaje*Math.pow(10,2))/Math.pow(10,2);
                String porcetProf = "Han culminado el año sabático "+String.valueOf(listProf.size());
                porcetProf += " profesores de un total de "+String.valueOf(listProfTotal.size());
                porcetProf += " profesores lo que representa un "+String.valueOf(porcentaje);
                porcetProf += "% de la cantidad total de profesores con un registro en el PAS en la historia";
                double [] porcTotalesHist = new double[2];
                porcTotalesHist[0] = porcentaje;
                porcTotalesHist[1] = 100.00 - porcentaje;
                request.getSession().setAttribute("year", anual);
                request.getSession().setAttribute("porcetProf", porcetProf);
                request.getSession().setAttribute("porcTotalHist",porcTotalesHist);
                request.getSession().setAttribute("L_ProfesorCulmino", L_ProfesorCulmino);
                request.getSession().setAttribute("numProfsTrimestrales", numProfsTrimestrales);
                request.getSession().setAttribute("porcProfCulTrmAS", porcProfCulTrmAS);
                request.getSession().setAttribute("baosPDF", generarPDFProfCulmAS(request));
            }else{
                salida = SALIDA_1;
            }
            request.getSession().setAttribute("opcion", 2);
            fF_EstdPAS_TrimSemAn.reset(mapping, request);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ProfCulminaronAS.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_GenerarPDFDivsTrmtDDP.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    private ByteArrayOutputStream generarPDFDivsTrmtDDP(HttpServletRequest request)
            throws Exception {
            List<Profesor> L_ProfTramDiv = (List<Profesor>)request.getSession()
                    .getAttribute("L_ProfesorDivisas");
             Double[] porcProfTramDiv = (Double[])request.getSession().getAttribute("porcentajeTrimTotal");
             Integer[] montosTrimestralesTotal = (Integer[])request.getSession().getAttribute("montosTrimestralesTotal");
             String mensaje = (String)request.getSession().getAttribute("porcetProf");
             int year = (Integer)request.getSession().getAttribute("year");
             double[] porcTotalesHist = (double[])request.getSession().getAttribute("porcTotalHist");
             String nombrePDF = "PAS - Divisas Tramitadas por la DDP en "+String.valueOf(year);
             request.getSession().setAttribute("nombrePDF", nombrePDF);
             String tituloPDF = "PAS - Divisas Tramitadas por la DDP en "+String.valueOf(year);
             String tablaResumen = "Montos totales Tramitados en el año "+String.valueOf(year);
             String nombreGraphBarra = "Montos totales Tramitados en el año "+String.valueOf(year);
             String nombrePieGraph = "Porción de divisas tramitadas por la DDP";
             String[] etiqPie = new String[porcTotalesHist.length];
             etiqPie[0] = "Divisas tramitadas en "+String.valueOf(year);
             etiqPie[1] = "Divisas tramitadas en otros años";
             ByteArrayOutputStream baosPDF = contruirPDF("NDT",etiqPie,nombrePieGraph,nombreGraphBarra,tablaResumen,tituloPDF,nombrePDF,L_ProfTramDiv,
                     porcProfTramDiv,montosTrimestralesTotal,mensaje,year,porcTotalesHist,request);
            return baosPDF;
    }

/**
     * Called by Struts for the execution of action A_GenerarPDFProfCulmAS.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    private ByteArrayOutputStream generarPDFProfCulmAS(HttpServletRequest request)
            throws Exception {
             List<Profesor> L_ProfCulmAS = (List<Profesor>)request.getSession()
                    .getAttribute("L_ProfesorCulmino");
             Double[] porcProfCulTrmAS = (Double[])request.getSession().getAttribute("porcProfCulTrmAS");
             Integer[] numProfsTrimestrales = (Integer[])request.getSession().getAttribute("numProfsTrimestrales");
             String mensaje = (String)request.getSession().getAttribute("porcetProf");
             int year = (Integer)request.getSession().getAttribute("year");
             double[] porcTotalesHist = (double[])request.getSession().getAttribute("porcTotalHist");
             String nombrePDF = "PAS - Profesores que culminaron el Año Sabático en "+String.valueOf(year);
             request.getSession().setAttribute("nombrePDF", nombrePDF);
             String tituloPDF = "PAS - Profesores que culminaron el Año Sabático en "+String.valueOf(year);
             String tablaResumen = "Número de profesores que culminarion AS en el año "+String.valueOf(year);
             String nombreGraphBarra = "Profesores que culminarion AS en el año "+String.valueOf(year);
             String nombrePieGraph = "Porción de profesores que culminarion PAS";
             String[] etiqPie = new String[porcTotalesHist.length];
             etiqPie[0] = "Profs. Culminarion PAS";
             etiqPie[1] = "Profs. con registro PAS";
             ByteArrayOutputStream baosPDF = contruirPDF("AS",etiqPie,nombrePieGraph,nombreGraphBarra,tablaResumen,tituloPDF,nombrePDF,L_ProfCulmAS,
                     porcProfCulTrmAS,numProfsTrimestrales,mensaje,year,porcTotalesHist,request);
             return baosPDF;
    }

    private ByteArrayOutputStream contruirPDF(String tipo,String[] etiqPie,String nombrePieGraph,String nombreGraphBarra,String tablaResumen,
                             String tituloPDF,String nombrePDF,List<Profesor> L_ProfCulmAS,Double[] porcProfCulTrmAS,
                             Integer[] numProfsTrimestrales,String mensaje,int year,double[] porcTotalesHist, HttpServletRequest request)
                             throws Exception{
        Document document = new Document(PageSize.LETTER.rotate());
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baosPDF);
        document.open();

        //Seteo de la cebolla
        URL base = this.getClass().getResource("");
        String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
        GifImage img = new GifImage(path);
        int frame_count = img.getFrameCount();
        for (int i = 1; i <= frame_count; i++) {
            document.add(img.getImage(i));
        }

        //Seteo Membrete
        document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n"
                + "Programa Actualización Académica"));

        //Seteo el titulo y lo agrego al documento
        Paragraph title = new Paragraph(tituloPDF, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
        title.setAlignment(Element.ALIGN_CENTER);
        title.setSpacingAfter(25);
        document.add(title);


        //Defino las relaciones de tamano entre las columnas
        float[] anchos = new float[10];
        anchos[0] = 12;//Apellidos
        anchos[1] = 12;//Nombres
        anchos[2] = 9;//Cedula
        anchos[3] = 5;//Edad
        anchos[4] = 15;//Email
        anchos[5] = 10;//Categoria
        anchos[6] = 10;//Division
        anchos[7] = 11;//Departamen
        anchos[8] = 15;//Fecha ingresa USB
        anchos[9] = 10;//Novel

        //Creo la tabla
        PdfPTable table = new PdfPTable(10);
        table.setWidthPercentage(100);
        table.setWidths(anchos);

        //Anado los headers a la tabla
        table.addCell("Apellidos");
        table.addCell("Nombres");
        table.addCell("Cédula");
        table.addCell("Edad");
        table.addCell("Email");
        table.addCell("Categoría");
        table.addCell("División");
        table.addCell("Departamento");
        table.addCell("Fecha de ingreso USB");
        table.addCell("¿Es novel?");

        //Agrego los datos a la tabla
        for (int i = 0; i < L_ProfCulmAS.size(); i++) {
            Profesor prof = L_ProfCulmAS.get(i);
            table.addCell(prof.getPrimerApellido() + " " + prof.getSegundoApellido());//Apellidos
            table.addCell(prof.getPrimerNombre() + " " + prof.getSegundoNombre());//Nombres
            table.addCell(Integer.toString(prof.getCi()));//Cedula
            table.addCell(prof.getEdad());//Edad
            table.addCell(prof.getCorreo());//Email
            table.addCell(prof.getCategoria());//Categoria
            table.addCell(prof.getDivision());//Division
            table.addCell(prof.getDepartamento());//Departamento
            table.addCell(prof.getFec_Ing_USB().toString());//Fecha ingreso usb
            if (prof.getNovel()) {
                table.addCell("Si");
            } else {
                table.addCell("No");
            }
        }
        // Agrego la tabla creada al documento
        document.add(table);

        Paragraph title1 = new Paragraph(tablaResumen);
        title1.setAlignment(Element.ALIGN_CENTER);
        title1.setSpacingAfter(25);
        document.add(title1);


        //Defino las relaciones de tamano entre las columnas
        float[] anchos1 = new float[4];
        anchos1[0] = 19;//Enero-Marzo
        anchos1[1] = 19;//Abril-Junio
        anchos1[2] = 19;//Julio-Septiembre
        anchos1[3] = 19;//Octubre-Diciembre

        //Creo la tabla
        PdfPTable table1 = new PdfPTable(4);
        table1.setWidthPercentage(100);
        table1.setWidths(anchos1);

        //Anado los headers a la tabla
        table1.addCell("Enero - Marzo");
        table1.addCell("Abril - Junio");
        table1.addCell("Julio - Septiembre");
        table1.addCell("Octubre - Diciembre");

        //Agrego los datos a la tabla
        table1.addCell(numProfsTrimestrales[0].toString() + " profs.");
        table1.addCell(numProfsTrimestrales[1].toString() + " profs.");
        table1.addCell(numProfsTrimestrales[2].toString() + " profs.");
        table1.addCell(numProfsTrimestrales[3].toString() + " profs.");
        table1.addCell(porcProfCulTrmAS[0].toString() + "%");
        table1.addCell(porcProfCulTrmAS[1].toString() + "%");
        table1.addCell(porcProfCulTrmAS[2].toString() + "%");
        table1.addCell(porcProfCulTrmAS[3].toString() + "%");
        document.add(table1);
        document.add(new Paragraph("Porcentajes calculados en relación al año " + String.valueOf(year)));
        document.add(new Paragraph(mensaje));

        //Seteo los datos del grafico
        String yTitle = "Porcentaje de Profesores";
        String xTitle = "Trimestres del año " + String.valueOf(year);
        String graphTitle = nombreGraphBarra;
        String[] xLabels = new String[4];
        xLabels[0] = "Ene-Mar";
        xLabels[1] = "Abr-Jun";
        xLabels[2] = "Jul-Sep";
        xLabels[3] = "Oct-Dic";
        double[][] datos = new double[1][porcProfCulTrmAS.length];
        for (int i = 0; i < porcProfCulTrmAS.length; i++) {
            datos[0][i] = porcProfCulTrmAS[i];
        }
        String[] leyendaLabels = new String[datos.length];
        if (tipo.equals("AS")){
            leyendaLabels[0] = "Porcentaje de profesores que culminaron el Año Sabático";
        }else if (tipo.equals("NDT")){
            leyendaLabels[0] = "Porcentaje de divisas tramitadas";
        }
        
        double[] dataPie = new double[porcTotalesHist.length];
        for (int i = 0; i < porcTotalesHist.length; i++) {
            dataPie[i] = porcTotalesHist[i];
        }
        String[] labelsPie = etiqPie;
        String pieTitle = nombrePieGraph;
        contruirGrafico(yTitle, xTitle, graphTitle, xLabels, datos, leyendaLabels, document, dataPie, labelsPie, pieTitle,request);

        document.close();
        return baosPDF;
    }

    private List listYears() {
        Date actualDate = new Date();
        LinkedList listYears = new LinkedList();
        int year = actualDate.getYear() + 1900;
        for (int i = year - 110; i <= year + 20; i++) {
            listYears.add(i);
        }
        return listYears;
    }

    private void contruirGrafico(String yTitle, String xTitle, String GraphTitle, String[] xLabels, double[][] datos,
                                     String[] leyendaLabels, Document document, double[] dataPie, String[] labelsPie,
                                     String pieTitle,HttpServletRequest request) throws Exception{
            try{
                //Grafico de barras
                BarChartProperties barChartProperties = new BarChartProperties();
                LegendProperties legendProperties = new LegendProperties();
                ChartProperties chartProperties = new ChartProperties();
                AxisProperties axisProperties = new AxisProperties( false );

                int width = 550;
                int height = 360;

                DataAxisProperties dataAxisProperties = (DataAxisProperties) axisProperties.getYAxisProperties();

                try {
                    double max = 0.0;
                    for(int i = 0; i < datos.length; i++){
                        for(int j = 0; j < datos[i].length; j++){
                            if(max < datos[i][j]){
                                max = datos[i][j];
                            }
                        }
                    }
                    int maxInt = (int)max;
                    dataAxisProperties.setNumItems(5);
                    dataAxisProperties.setUserDefinedScale(0, 25);
                }
                catch( PropertyException propertyException ){
                    propertyException.printStackTrace();
                }

                dataAxisProperties.setRoundToNearest( 0 );

                ValueLabelRenderer valueLabelRenderer = new ValueLabelRenderer( false, false, true, -1 );
                valueLabelRenderer.setValueLabelPosition( ValueLabelPosition.ON_TOP );
                valueLabelRenderer.useVerticalLabels( false );
                barChartProperties.addPostRenderEventListener( valueLabelRenderer );

                String yAxisTitle = yTitle;
                String xAxisTitle = xTitle;
                String[] xAxisLabels = xLabels;
                String title2 = GraphTitle;
                IAxisDataSeries dataSeries = new DataSeries( xAxisLabels, xAxisTitle, yAxisTitle, title2 );

                double[][] data = datos;
                String[] legendLabels = leyendaLabels;
                Paint[] allPaints = new Paint[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,
                                                Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
                Paint[] paints = new Paint[data.length];
                for(int i = 0; i < data.length; i++){
                    paints[i] = allPaints[i];
                }
                dataSeries.addIAxisPlotDataSet( new AxisChartDataSet( data, legendLabels, paints, ChartType.BAR, barChartProperties ) );

                AxisChart axisChart = new AxisChart( dataSeries, chartProperties, axisProperties, legendProperties, width, height );
                request.getSession().setAttribute("GraficoBarra", axisChart);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                JPEGEncoder.encode(axisChart, 1.0f, baos);

                Image barChartImage = Image.getInstance(baos.toByteArray());
                document.add(barChartImage);


                //Grafica de torta
                double[] data1= dataPie;
                String[] labels= labelsPie;
                Paint[] allPaints1= new Paint[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,
                                                Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
                Paint[] paints1 = new Paint[data1.length];
                for(int i = 0; i < data1.length; i++){
                    paints1[i] = allPaints1[i];
                }

                PieChart2DProperties pieChart2DProperties= new PieChart2DProperties();
                PieChartDataSet pieChartDataSet= new PieChartDataSet(pieTitle, data1, labels, paints1, pieChart2DProperties );

                PieChart2D pieChart2D= new PieChart2D( pieChartDataSet, new LegendProperties(), new ChartProperties(), width, height );
                request.getSession().setAttribute("GraficoPie", pieChart2D);
                ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
                PNGEncoder.encode(pieChart2D, baos2);
                Image pieChartImage = Image.getInstance(baos2.toByteArray());
                document.add(pieChartImage);

                } catch (Exception ex) {
                    throw ex;
                }
        }
    public void A_PDFEstadisticaPAS(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String nombrePDF = (String) request.getSession().getAttribute("nombrePDF");
        ByteArrayOutputStream baosPDF = (ByteArrayOutputStream) request.getSession().getAttribute("baosPDF");

        // Le indico al Servlet que voy a enviar un archivo pdf
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", " attachment; filename=\"" + nombrePDF + ".pdf\"");

        baosPDF.writeTo(response.getOutputStream());
    }

    public void A_GraficoEstadisticaPAS(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String tipoGrafica = request.getParameter("tipoGrafica");
        if(tipoGrafica.equals("GraficoBarra")){
            AxisChart axisChart = (AxisChart)request.getSession().getAttribute("GraficoBarra");
            ServletEncoderHelper.encodePNG(axisChart, response);
        }else if(tipoGrafica.equals("GraficoPie")){
            PieChart2D pieChart2D = (PieChart2D)request.getSession().getAttribute("GraficoPie");
            ServletEncoderHelper.encodePNG(pieChart2D, response);
        }
    }

}